//: Playground - noun: a place where people can play

import UIKit

//: # swfit 读书笔记

//: ##  元组
//: ### 元组中的值可以是不同类型的
let http404Error = (404,"request is error")

//: ### 1. 可以将元组中的内容"分解成单独"的变量和常量。
let (statusCode,statusMessage) = http404Error
print("请求编码是 \(statusCode) "+"\n请求信息是 \(statusMessage)")

//: ### 2.只需元组的部分内容，忽略的部分中"_"标记
let (justStatusCode,_) = http404Error
print("\n元组部分内容是 \(justStatusCode)")

//: ### 3.通过"下标"访问元组中的内容，下标从零开始
print("\n第一个下标内容是 \(http404Error.0) -- 第二个下标的内容是 \(http404Error.1)）")

//: ### 4.创建元组的时候也可以通过"键值对"形式创建,并通过 key 获取 value
let keyValue = (keyStatusCode:404,keyStatusMessage:"request is error")
print("key 是  \(keyValue.keyStatusCode) value 是 \(keyValue.keyStatusMessage)")

//: ## 可选绑定
//: ### 判断的属性必须是个 带 "?" 的属性
//: #### let name:String? = "zzp" 如果去掉 "?" 报错： Initializer for conditional binding must have Optional type, not 'String'（意思是初始条件必须是可选类型不能是 String 类型）
let name:String? = "zzp"
if let trueName = name {
    print(" 可选绑定 \(trueName)")
}

//: ### 你可以包含多个可选绑定和多个布尔条件在一个 if 语句中，只要使用逗号隔开就行。
if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
    print("\(firstNumber) < \(secondNumber) < 100")
}

if let firstNumber = Int("4") {
    if let secondNumber = Int("42") {
        if firstNumber < secondNumber && secondNumber < 100 {
            print("\(firstNumber) < \(secondNumber) < 100")
        }
    }
}

//: 错误处理
/*:
 当一个函数可能出错是 通过 "throws" 关键字抛出
 catch 后可以拼接 具体的 错误枚举
 
 do {
 try makeASandwich()
 eatASandwich()
 } catch SandwichError.outOfCleanDishes {
 washDishes()
 } catch SandwichError.missingIngredients(let ingredients) {
 buyGroceries(ingredients)
 }
 
 */
func canThrowAnError() throws {
    // 这个函数有可能抛出错误
}
//: ### 处理错误 通过 do 。。。。 catch 。。。。 语句
do {
    try canThrowAnError()
    // 没有错误消息抛出
} catch {
    // 有一个错误消息抛出
}

//:##  断言
//:### 你可以使用全局 assert(_:_:file:line:) 函数来写一个断言
let age = 3 // 负数就会触发断言
assert(age >= 0, "A person's age cannot be less than zero")
// 因为 age < 0，所以断言会触发
